home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / unixcpio.gz / unixnet.cpio / ndir.c < prev    next >
C/C++ Source or Header  |  1994-07-11  |  3KB  |  143 lines

  1. #if !defined(BSD4_2) && !defined(BSD4_1C) && !defined(HP9K5)
  2. #ifdef M_XENIX
  3. #include <sys/types.h>
  4. #endif /* M_XENIX */
  5. #include <sys/param.h>
  6. #include "ndir.h"
  7.  
  8. #ifdef SCCSID
  9. static char    *SccsId = "@(#)ndir.c    1.12    10/15/87";
  10. #endif /* SCCSID */
  11.  
  12. /*
  13.  * support for Berkeley directory reading routine on a V7 file system
  14.  */
  15.  
  16. extern char *malloc();
  17.  
  18. /*
  19.  * open a directory.
  20.  */
  21. DIR *
  22. opendir(name)
  23. char *name;
  24. {
  25.     register DIR *dirp;
  26.     register int fd;
  27.  
  28.     if ((fd = open(name, 0)) == -1)
  29.         return NULL;
  30.     if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) {
  31.         close (fd);
  32.         return NULL;
  33.     }
  34.     dirp->dd_fd = fd;
  35.     dirp->dd_loc = 0;
  36.     return dirp;
  37. }
  38.  
  39. /*
  40.  * read an old style directory entry and present it as a new one
  41.  */
  42. #ifdef pyr
  43. /* Pyramid in the AT&T universe */
  44. #define ODIRSIZ 248
  45. struct olddirect {
  46.     long    od_ino;
  47.     short    od_fill1, od_fill2;
  48.     char od_name[ODIRSIZ];
  49. };
  50. #else /* V7 file system */
  51. #define    ODIRSIZ    14
  52.  
  53. struct    olddirect {
  54.     short    od_ino;
  55.     char    od_name[ODIRSIZ];
  56. };
  57. #endif /* !pyr */
  58.  
  59. /*
  60.  * get next entry in a directory.
  61.  */
  62. struct direct *
  63. readdir(dirp)
  64. register DIR *dirp;
  65. {
  66.     register struct olddirect *dp;
  67.     static struct direct dir;
  68.  
  69.     for (;;) {
  70.         if (dirp->dd_loc == 0) {
  71.             dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, 
  72.                 DIRBLKSIZ);
  73.             if (dirp->dd_size <= 0)
  74.                 return NULL;
  75.         }
  76.         if (dirp->dd_loc >= dirp->dd_size) {
  77.             dirp->dd_loc = 0;
  78.             continue;
  79.         }
  80.         dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
  81.         dirp->dd_loc += sizeof(struct olddirect);
  82.         if (dp->od_ino == 0)
  83.             continue;
  84.         dir.d_ino = dp->od_ino;
  85.         strncpy(dir.d_name, dp->od_name, ODIRSIZ);
  86.         dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */
  87.         dir.d_namlen = strlen(dir.d_name);
  88.         dir.d_reclen = DIRSIZ(&dir);
  89.         return (&dir);
  90.     }
  91. }
  92.  
  93. /*
  94.  * close a directory.
  95.  */
  96. void
  97. closedir(dirp)
  98. register DIR *dirp;
  99. {
  100.     close(dirp->dd_fd);
  101.     dirp->dd_fd = -1;
  102.     dirp->dd_loc = 0;
  103.     free((char *)dirp);
  104. }
  105.  
  106. /*
  107.  * seek to an entry in a directory.
  108.  * Only values returned by "telldir" should be passed to seekdir.
  109.  */
  110. void
  111. seekdir(dirp, loc)
  112. register DIR *dirp;
  113. long loc;
  114. {
  115.     long curloc, base, offset;
  116.     struct direct *dp;
  117.     long lseek(), telldir();
  118.  
  119.     curloc = telldir(dirp);
  120.     if (loc == curloc)
  121.         return;
  122.     base = loc & ~(DIRBLKSIZ - 1);
  123.     offset = loc & (DIRBLKSIZ - 1);
  124.     (void) lseek(dirp->dd_fd, base, 0);
  125.     dirp->dd_loc = 0;
  126.     while (dirp->dd_loc < offset) {
  127.         dp = readdir(dirp);
  128.         if (dp == NULL)
  129.             return;
  130.     }
  131. }
  132.  
  133. /*
  134.  * return a pointer into a directory
  135.  */
  136. long
  137. telldir(dirp)
  138. DIR *dirp;
  139. {
  140.     return lseek(dirp->dd_fd, 0L, 1) - dirp->dd_size + dirp->dd_loc;
  141. }
  142. #endif /* !BSD4_2 && !BSD4_1C && !HP9K5 */
  143.